using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
using demo001.Config;
using Microsoft.Extensions.Logging;

namespace demo001.Services
{
    // 添加一个日志字段
   
        
    /// <summary>
    /// API服务类，处理所有HTTP请求
    /// 提供了统一的HTTP请求处理机制，包括认证、序列化、错误处理等功能
    /// 作为应用程序与后端服务器通信的核心组件
    /// </summary>
    public class ApiService
    {
        /// <summary>
        /// HTTP客户端实例
        /// 用于发送HTTP请求到服务器
        /// </summary>
        private readonly HttpClient _httpClient;

        private readonly ILogger<ApiService> _logger;

        // 修改构造函数以接收 ILogger
        public ApiService(ILogger<ApiService> logger = null)
        {
            _httpClient = new HttpClient();
            _logger = logger;
        }

        /// <summary>
        /// JSON序列化选项
        /// 配置JSON序列化和反序列化的行为
        /// </summary>
        private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true // 属性名称大小写不敏感
        };

        /// <summary>
        /// 构造函数
        /// 初始化HTTP客户端实例
        /// </summary>
        public ApiService()
        {
            _httpClient = new HttpClient();
        }

        /// <summary>
        /// 发送GET请求的通用方法
        /// </summary>
        /// <typeparam name="T">响应数据的类型</typeparam>
        /// <param name="endpoint">API端点配置</param>
        /// <param name="parameters">URL参数字典（可选）</param>
        /// <returns>反序列化后的响应数据</returns>
        public async Task<T> GetAsync<T>(ApiEndpoint endpoint, Dictionary<string, string> parameters = null)
        {
            try 
            {
                // 构建完整的 URL，包括查询参数
                var fullUrl = endpoint.GetFullUrl();
                
                // 如果有额外参数，添加到 URL
                if (parameters != null && parameters.Count > 0)
                {
                    var queryParams = parameters.Select(p => 
                        $"{Uri.EscapeDataString(p.Key)}={Uri.EscapeDataString(p.Value)}"
                    );
                    fullUrl += $"?{string.Join("&", queryParams)}";
                }

                System.Diagnostics.Debug.WriteLine($"发送 GET 请求到 URL: {fullUrl}");

                // 添加认证头（如果需要）
                await AddAuthHeaderIfRequired(endpoint);

                // 发送 GET 请求
                var response = await _httpClient.GetAsync(fullUrl);

                // 打印响应状态码
                System.Diagnostics.Debug.WriteLine($"响应状态码: {response.StatusCode}");

                // 如果响应不成功，尝试读取错误内容
                if (!response.IsSuccessStatusCode)
                {
                    var errorContent = await response.Content.ReadAsStringAsync();
                    System.Diagnostics.Debug.WriteLine($"请求失败。错误内容: {errorContent}");
                    throw new ApiException(response.StatusCode, errorContent);
                }

                // 读取响应内容
                var content = await response.Content.ReadAsStringAsync();
                System.Diagnostics.Debug.WriteLine($"响应内容: {content}");

                // 反序列化响应
                return JsonSerializer.Deserialize<T>(
                    content, 
                    new JsonSerializerOptions 
                    { 
                        PropertyNameCaseInsensitive = true 
                    });
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"GetAsync 发生错误: {ex.Message}");
                System.Diagnostics.Debug.WriteLine($"异常堆栈: {ex.StackTrace}");
                throw;
            }
        }

        /// <summary>
        /// 发送POST请求的通用方法
        /// </summary>
        /// <typeparam name="T">响应数据的类型</typeparam>
        /// <param name="endpoint">API端点配置</param>
        /// <param name="data">要发送的数据对象</param>
        /// <returns>反序列化后的响应数据</returns>
        public async Task<T> PostAsync<T>(ApiEndpoint endpoint, object data)
        {
            try 
            {
                // 打印请求详情
                // 使用 ILogger 记录日志（如果可用）
              
                // 使用 Debug.WriteLine
                System.Diagnostics.Debug.WriteLine($"[ApiService-Debug] 发送 POST 请求到 URL: {endpoint.GetFullUrl()}");
                System.Diagnostics.Debug.WriteLine($"[ApiService-Debug] 请求数据: {JsonSerializer.Serialize(data)}");

                
                

                // 添加认证头（如果需要）
                await AddAuthHeaderIfRequired(endpoint);

                // 创建请求内容
                var content = new StringContent(
                    JsonSerializer.Serialize(data), 
                    Encoding.UTF8, 
                    "application/json"
                );

                // 发送 POST 请求
                var response = await _httpClient.PostAsync(endpoint.GetFullUrl(), content);

                // 打印响应状态码
                System.Diagnostics.Debug.WriteLine($"响应状态码: {response.StatusCode}");

                // 读取响应内容
                var responseContent = await response.Content.ReadAsStringAsync();
                System.Diagnostics.Debug.WriteLine($"响应内容: {responseContent}");

                // 如果响应不成功，尝试读取错误内容
                if (!response.IsSuccessStatusCode)
                {
                    System.Diagnostics.Debug.WriteLine($"请求失败。错误内容: {responseContent}");
                    throw new ApiException(response.StatusCode, responseContent);
                }

                // 处理并返回响应
                return JsonSerializer.Deserialize<T>(
                    responseContent, 
                    new JsonSerializerOptions 
                    { 
                        PropertyNameCaseInsensitive = true 
                    }
                );
            }
            catch (HttpRequestException ex)
            {
                // 网络连接错误
                System.Diagnostics.Debug.WriteLine($"网络连接错误: {ex.Message}");
                System.Diagnostics.Debug.WriteLine($"详细异常信息: {ex}");
                throw new ApiException(System.Net.HttpStatusCode.BadRequest, $"网络连接错误: {ex.Message}");
            }
            catch (TaskCanceledException ex)
            {
                // 请求超时
                System.Diagnostics.Debug.WriteLine($"请求超时: {ex.Message}");
                System.Diagnostics.Debug.WriteLine($"详细异常信息: {ex}");
                throw new ApiException(System.Net.HttpStatusCode.RequestTimeout, $"请求超时: {ex.Message}");
            }
            catch (Exception ex)
            {
                // 其他未处理的异常
                System.Diagnostics.Debug.WriteLine($"PostAsync 发生未知错误: {ex.Message}");
                System.Diagnostics.Debug.WriteLine($"异常堆栈: {ex.StackTrace}");
                throw;
            }
        }

        /// <summary>
        /// 处理API响应的通用方法
        /// 处理HTTP响应，包括错误检查和数据反序列化
        /// </summary>
        /// <typeparam name="T">响应数据的类型</typeparam>
        /// <param name="response">HTTP响应消息</param>
        /// <returns>反序列化后的响应数据</returns>
        /// <exception cref="ApiException">当API响应不成功时抛出</exception>
        private async Task<T> HandleResponse<T>(HttpResponseMessage response)
        {
            var content = await response.Content.ReadAsStringAsync();

            if (!response.IsSuccessStatusCode)
            {
                throw new ApiException(response.StatusCode, content);
            }

            return JsonSerializer.Deserialize<T>(content, _jsonOptions);
        }

        /// <summary>
        /// 添加认证头（如果需要）
        /// 检查API端点是否需要认证，如果需要则添加Bearer token
        /// </summary>
        /// <param name="endpoint">API端点配置</param>
        /// <exception cref="UnauthorizedAccessException">当需要认证但没有token时抛出</exception>
        private async Task AddAuthHeaderIfRequired(ApiEndpoint endpoint)
        {
            if (endpoint.RequiresAuth)
            {
                var token = await SecureStorage.Default.GetAsync("auth_token");
                if (string.IsNullOrEmpty(token))
                {
                    throw new UnauthorizedAccessException("需要认证令牌");
                }
                _httpClient.DefaultRequestHeaders.Authorization = 
                    new AuthenticationHeaderValue("Bearer", token);
            }
        }
    }

    /// <summary>
    /// API异常类
    /// 用于封装API调用过程中的错误信息
    /// </summary>
    public class ApiException : Exception
    {
        /// <summary>
        /// HTTP状态码
        /// 表示API响应的HTTP状态
        /// </summary>
        public System.Net.HttpStatusCode StatusCode { get; }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="statusCode">HTTP状态码</param>
        /// <param name="message">错误消息</param>
        public ApiException(System.Net.HttpStatusCode statusCode, string message) 
            : base(message)
        {
            StatusCode = statusCode;
        }
    }
}